Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.10.2016, 12:37
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Идентификация запросов в обработчике XMLHttpRequest
Стоит задача получить со страницы url(несколько), перейти по ним, распарсить, проверить, отправить форму и снова проверить ответ.

Так вот, делаю так:
var xhr		// Глобальный идентификатор XMLHttpRequest
var xhrId	// Глобальный идентификатор запроса

function GetHttpRequest(href, id) // Формирование запроса(url запроса, id запроса)
{
	xhr = new XMLHttpRequest()
	xhr.withCredentials = true
	xhr.onreadystatechange = ProcessRequestChange
	xhr.open('GET', href, true)
	xhr.send(null)
	xhrId = id // Записать id в глобальную переменную
}
function ProcessRequestChange()		// Общий обработчик
{
	if(xhr.readyState != 4) return	// Если запрос не выполнен - игнор
	if(xhr.status == 200)			// Всё хорошо, запрос отправлен, ответ пришел
	{
		html = xhr.responseText // Получить текст ответа
		
		switch(xhrId)
		{
			case 999: // Получить район(первый запрос)
			{
				var a
				if((a = html.indexOf('Район: ')) != -1)
				{
					var s = html.indexOf('<b><a href=\'', a) + 12
					var e = html.indexOf('\'>', s)
					var str = html.substring(s, e).replace('amp;', '')
					GetHttpRequest('http://www.site.ru/' + str + '&st=sh', 998) // Получить все объекты в производстве
				}
				break
			}
			case 998: // Получить все предприятия в производстве(второй запрос)
			{
				var s = 0, id = 0

				while((s = html.indexOf('info.php?id=', s)) != -1) // Получить все ссылки
				{
					var e = html.indexOf('\'>', s)
					var str = html.substring(s, e)
					s = e

					if(str.length > 23) continue // Когда на объект можно устроиться ссылки дублируются...

					GetHttpRequest('http://www.site.ru/' + str, 100 + id++) // Запрос на предприятие производства
				}
				break
			}
			case 100: // Обработка предприятий производства, искать формы отправки
			{
				// И вот тут я впёрся, запросы - то приходят не сразу + вразнобой, а id запроса меняется
				break
			}
			case 0: break // Без обработки
		}
	}
}
chrome.runtime.onMessage.addListener // Сообщение из другого скрипта(по нажатию кнопки)
(
	function(request, sender, sendResponse)
	{
		GetHttpRequest('http://www.site.ru/map.php', 999) // Получить район(первый запрос)
	}
)


Получаю значит последовательно:страницу(и з неё дергаю адрес), потом получаю несколько ссылок, и делаю запросы в цикле.

И вот тут у меня всё пошло не по плану, запросы приходят не сразу + вразнобой, а id запроса перезаписывается.

В итоге: код в обработчике сможет выполниться только для последнего запроса...

Может есть варианты по другому как - то ид передавать?

+Не подскажите как свитчить диапазон чисел?
В JS оно как - то по другому делается чем во всех других языках(понятно, код - то не компилируется).

В общем как мне это сделать?
case: 100..120:


Так?
switch(xhrId)
{
	case 999: break
	case 998: break
	case xhrId > 99 && xhrId < 121: break
}

Последний раз редактировалось Артист, 09.10.2016 в 12:44.
Ответить с цитированием
  #2 (permalink)  
Старый 09.10.2016, 12:55
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Можно конечно отдельный обработчик сделать для этих запросов...
Но мне потом нужно ещё ответ от каждого получить, и нужно знать где кто...
Ответить с цитированием
  #3 (permalink)  
Старый 09.10.2016, 13:08
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

А можно в обработчик передавать что - то своё?
xhr.onreadystatechange = ProcessRequestChange

>>>
xhr.onreadystatechange = ProcessRequestChange(id)
Ответить с цитированием
  #4 (permalink)  
Старый 09.10.2016, 13:39
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Ну не прямо во всех(C подобные), а вообще так:
От 100 до 120
Цитата:
case: 100..120:
Включительно:
Если 100 или 103 или 105 или 120
Цитата:
case: 100, 103, 105, 120:
Так в JS не работает:
case: 100..120:


Гуглил:

var num = 5

switch(true)
{
   case num > 1 && num < 5: break // от 2 до 4
}


Так мне нужно и конкретное число и диапазон, без switch(true), я и if'ами так сделаю...

Последний раз редактировалось Артист, 09.10.2016 в 13:46. Причина: case
Ответить с цитированием
  #5 (permalink)  
Старый 09.10.2016, 14:40
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Работает. Не в этом суть.
Как в JS сделать - то?
if'ами?
Ответить с цитированием
  #6 (permalink)  
Старый 09.10.2016, 15:34
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Я не делаю вид, что знаю другие языки.
Я делаю вид, что не знаю как это реализовать в JS.

В С, С++ да, так не проканает, там так:
Цитата:
switch(num) // От 1 до 3
{
case 1:
case 2:
case 3:
{
break
}
}
А вот в павн, паскаль так можно.

Ещё есть с 3мя точками, не помню в каком языке...
Ответить с цитированием
  #7 (permalink)  
Старый 09.10.2016, 15:39
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

П.с. затестил:
switch(5)
{
    case 1:
    case 2:
    case 3:
	case 4:
	case 5:
	{
		alert('1...5')
		break
	}
	default:
	{
		alert('default')
		break
	}
}

Последний раз редактировалось Артист, 09.10.2016 в 15:42.
Ответить с цитированием
  #8 (permalink)  
Старый 09.10.2016, 15:48
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Теперь по основному вопросу, почему так не работает?
Должно вызваться 4 раза, а не 1, и this не работает...

function GetHttpRequest(href, id)
{
	xhr = new XMLHttpRequest()
	xhr.withCredentials = true
	xhr.onreadystatechange = ProcessRequestChange(id)
	xhr.open('GET', href, true)
	xhr.send(null)
}
function ProcessRequestChange(id)
{
	alert(id + ' ' + this.readyState)
}
GetHttpRequest('http://javascript.ru', 24)
Ответить с цитированием
  #9 (permalink)  
Старый 09.10.2016, 16:06
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Да мне пoxyй Честно.
Не буду ничего доказывать и оправдываться.

Я обратился за помощью по конкретному вопросу, а всё остальное не имеет никакого отношения, особенно придирки к моим словам.

Последний раз редактировалось Артист, 09.10.2016 в 16:26.
Ответить с цитированием
  #10 (permalink)  
Старый 09.10.2016, 17:28
Профессор
Отправить личное сообщение для Артист Посмотреть профиль Найти все сообщения от Артист
 
Регистрация: 25.09.2016
Сообщений: 163

Всё, проблему решил:
function GetHttpRequest(href, data)
{
    var xhr = new XMLHttpRequest()
    xhr.withCredentials = true
    xhr.onreadystatechange = function(e)
    {
        e.data = data
        ProcessRequestChange.apply(this, arguments)
    }
    xhr.open('GET', href, true)
    xhr.send(null)
}
function ProcessRequestChange(e)
{
    alert(this.readyState + ' ' + e.data.rid)
}
GetHttpRequest('http://javascript.ru', {rid: 24})


Всем спасибо.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
XMLHttpRequest передача массива серверу JaneLane AJAX и COMET 5 16.05.2014 12:09
запрос на другой сайт XMLHttpRequest vscorpion Internet Explorer 9 24.12.2013 16:46
XMLHTTPRequest дождаться выполнения всех асинхронных запросов false Javascript под браузер 10 13.05.2012 15:57
Очередь XML запросов Евгений М AJAX и COMET 4 01.02.2012 11:05
XMLHttpRequest status=0, хотя запрос проходит. arigasa AJAX и COMET 4 15.02.2011 20:14